package telas.componentes;

import javax.swing.FocusManager;
import javax.swing.JFormattedTextField;
import business.seguranca.Usuario;
import business.sistema.IObjetoSistema;
import business.sistema.Observer;
import business.util.MaxLength;
import java.awt.Dimension;
import java.lang.reflect.Method;

public class CampoEditavel extends JFormattedTextField implements Observer
{
	private static final long serialVersionUID = -8248762714627222276L;
	private int maxLength;
	private String atributoObservado = "";
	private boolean preencherZero = false;
	private int controleAcesso = 1;
	private Usuario usuario;

	/**
	 * This method initializes 
	 * 
	 */
	public CampoEditavel() 
	{
		super();
		initialize();
	}
	
	public CampoEditavel(Usuario usuario) 
	{
		super();
		setUsuario(usuario);
		initialize();
	}
	
	public CampoEditavel(AbstractFormatter formmater)
	{
		super(formmater);
		initialize();
	}
	
	public CampoEditavel(AbstractFormatter formmater, Usuario usuario)
	{
		super(formmater);
		setUsuario(usuario);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() 
	{
        this.setPreferredSize(new Dimension(4, 23));
        this.setSize(new Dimension(114, 23));
        
        this.addKeyListener
	    (
	        new java.awt.event.KeyAdapter() 
	        {
	        	public void keyTyped(java.awt.event.KeyEvent e) 
	        	{
	        		verificaTecla(e);
	        	}
	        }
	     );
        
        this.addFocusListener
        (
        	new java.awt.event.FocusAdapter() 
        	{   
	        	public void focusLost(java.awt.event.FocusEvent e) 
	        	{    
	        		preencheZero();
	        	}
	        	public void focusGained(java.awt.event.FocusEvent e) 
	        	{
	        		removeZero();
	        	}
        	}
        );
	}
	
	private void preencheZero() 
	{
		if(preencherZero)
		{
			int maxLength = getMaxLength();
			int tamanhoTexto = getText().length();
			int quantidadeZeros = 0;
			
			if(tamanhoTexto > 0)
			{
				if(maxLength > tamanhoTexto)
					quantidadeZeros = maxLength - tamanhoTexto;
				else
					quantidadeZeros = tamanhoTexto - maxLength;
			}
			
			for(int i = 0; i < quantidadeZeros; i++)
			{
				setText("0" + getText());
			}
		}
	}
	
	private void removeZero() 
	{
		if(preencherZero)
		{
			String textoSemZeros = "";
			String texto = getText();
			
			for(int i = 0; i < texto.length(); i++)
			{
				if(texto.charAt(i) != '0')
				{
					textoSemZeros = texto.substring(i, texto.length());
					setText(textoSemZeros);
					break;
				}
			}
		}
	}
	
	public void verificaTecla(java.awt.event.KeyEvent tecla)
	{
		// Se for a tecla <ENTER> passa para o proximo componente da tela
		if(tecla.getKeyChar() == '\n')
		{
			FocusManager.getCurrentManager().focusNextComponent();
		}
	}
	
	public int getMaxLength() 
	{
		return maxLength;
	}
	
	public void setMaxLength(int maxLength) 
	{
		this.maxLength = maxLength;
		
		this.setDocument(new MaxLength(maxLength));
	}
	
	public String getNumero()
	{
		String numeroFormatado = super.getText();
		String numero = "";
		
		/* Remove os caracter ponto(.) do numero */
		for(char caracter : numeroFormatado.toCharArray())
		{
			if(caracter != '.')
				numero += caracter;
		}
		
		numero = numero.replace(',', '.');
		
		return numero.replaceAll("[^0-9.]*", "");
	}
	
	@Override
	public void setText(String arg0) 
	{
		super.setText(arg0);
	}

	public void update(IObjetoSistema objeto, String mensagem) throws Exception
	{
		Class<?> clsObjeto = objeto.getClass();
		Method objMetodo = clsObjeto.getMethod("get" + getAtributoObservado());
		
		String texto = String.valueOf(objMetodo.invoke(objeto)); 
		
		setText(texto);
	}

	public String getAtributoObservado() 
	{
		return atributoObservado;
	}

	public void setAtributoObservado(String atributoObservado) 
	{
		this.atributoObservado = atributoObservado;
	}

	public boolean isPreencherZero() 
	{
		return preencherZero;
	}

	public void setPreencherZero(boolean preencherZero) 
	{
		this.preencherZero = preencherZero;
	}

	public int isControleAcesso() 
	{
		return controleAcesso;
	}

	public void setControleAcesso(int controleAcesso) 
	{
		this.controleAcesso = controleAcesso;
		
		if( Usuario.getUsuarioSessao().getTipoUsuario().getCodigo() >= controleAcesso )
		{
			setEnabled(true);
		}
		else
		{
			setEnabled(false);
		}
	}

	public Usuario getUsuario() 
	{
		return usuario;
	}

	public void setUsuario(Usuario usuario) 
	{
		this.usuario = usuario;
	}
}
